/*
 * @(#)ReturnValue.java $version 2010. 8. 11
 *
 * Copyright 2007-2010 NHN Corp. All rights Reserved. 
 * NHN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

package com.nhncorp.usf.core.call;

/**
 * {@link Call}의 실행 결과값을 표현한다. 리턴 값을 단순히 {@link Object}로 표현할 수도 있지만, 그럴 경우 리턴
 * 타입이 {@link Void}인 경우와 리턴 값이 <tt>null</tt>인 경우를 구분하는 것이 어렵기 때문에
 * {@link ReturnValue} 타입을 추가했다.
 * 
 * @author Web Platform Development Team
 */
public interface ReturnValue extends Reply {

	/**
	 * 리턴 값이 없는 경우 (리턴 타입이 {@link Void}인 경우)를 표현하는 {@link ReturnValue} 인스턴스.
	 * static type
	 */
	ReturnValue VOID = new ReturnValue() {
		/**
		 * 
		 */
		private static final long serialVersionUID = -794141337338826595L;

		public Object get() {
			return null;
		}

		public Class< ? > getType() {
			return Void.TYPE;
		}

		@Override
		public String toString() {
			return "void";
		}
	};

	/**
	 * 리턴 값이 <tt>null</tt>인 경우를 표현하는 {@link ReturnValue} 인스턴스.
	 * static type
	 */
	ReturnValue NULL = new ReturnValue() {
		/**
		 * 
		 */
		private static final long serialVersionUID = -2990680186109675882L;

		public Object get() {
			return null;
		}

		public Class< ? > getType() {
			return null;
		}

		@Override
		public String toString() {
			return "null";
		}
	};

	/**
	 * 호출에 대한 리턴 값의 타입을 리턴한다. 만약 리턴 값이 없는 호출이었다면 {@link Void#TYPE}을 리턴한다.
	 * 
	 * @return 호출에 대한 리턴 값의 타입 
	 */
	Class< ? > getType();

	/**
	 * 호출에 대한 리턴 값을 리턴한다. 만약 리턴 값이 없는 호출이었다면
	 * <i>null</i>을 리턴한다.  리턴 값 자체가 <i>null</i>인 경우와
	 * 리턴 값이 없는 경우를 구분하려면 {@link #getType()} 메소드를 이용한다.
	 * 
	 * @return 호출에 대한 리턴값
	 */
	Object get();
}

